package stackqueuelinkedlist;

import java.io.*;

public class TowersOfHanoi {

	static int moves = 0;
	static int totalDisks = 0;
	
	public static void main(String[] arguments) throws java.io.IOException {
		int disks;
		char fromPole = 'A';
		char withPole = 'B';
		char toPole = 'C';
		disks = getNumber("\nHow many disks are there on the tower? ");
		totalDisks = disks;
		if(totalDisks > 10){
			System.out.println("Working...");
			}
		FileOutputStream fos = new FileOutputStream("TowersOfHanoiSolution.txt");
		PrintStream ps = new PrintStream(fos);
		solveHanoi(disks, fromPole, toPole, withPole, ps);
		ps.close();
		System.out.println();
		System.out.println("\nAmount of moves: " + moves + "\n");
		System.out.print("You can now access the TowersOfHanoiSolution.txt file");
		System.out.println(" which is in the same directory as the .class file of this program.");
		}
	
	static void solveHanoi(int disks, char fromPole, char toPole, char withPole, PrintStream ps) {
		if (disks >= 1) {
		  //move the first disk-1 disk from -> the with(buffer) pole
			solveHanoi(disks-1, fromPole, withPole, toPole, ps);
			//move the last one from -> to pole
			moveDisk(fromPole, toPole, ps);
			//move the disk-1 disk from with(buffer) -> topole
			solveHanoi(disks-1, withPole, toPole, fromPole, ps);
			}
		}
		
	static void moveDisk(char fromPole, char toPole, PrintStream ps) {
		moves++;
		if(totalDisks <= 10){
			System.out.print("Move from " + fromPole + " to " + toPole + ". ");
			ps.print("Move from " + fromPole + " to " + toPole + ". ");
			if (moves%4 == 0){
				System.out.println();
				ps.println();
				}
			}
			else {
			ps.print("Move from " + fromPole + " to " + toPole + ". ");
			if (moves%4 == 0){
				ps.println();
				}
			}
		}
	
	static int getNumber(String question) throws java.io.IOException {
		String theNumber;
		int number = 0;
		BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
		System.out.print(question);
		theNumber = in.readLine();
		System.out.println();
		number = Integer.parseInt(theNumber);
		return number;
		}
	}